home *** CD-ROM | disk | FTP | other *** search
Java Source | 2000-09-08 | 3.1 KB | 132 lines |
-
-
-
- package applets;
-
- import shout3d.*;
- import shout3d.core.*;
- import shout3d.math.*;
-
-
- public class BetterRotateMovePanel extends Shout3DPanel implements DeviceObserver, RenderObserver {
-
- Transform mover;
-
- int pixelStartX;
- int pixelStartY;
- int pixelEndX;
- int pixelEndY;
-
- float[] worldPos = new float[3];
-
- float [] eulers = new float [3];
- float [] axisAngle = new float [4];
- Quaternion q = new Quaternion();
-
-
- public BetterRotateMovePanel (Shout3DApplet applet){
- super(applet);
- }
-
- public void customInitialize() {
-
- addDeviceObserver(this,"MouseInput", null);
- getRenderer().addRenderObserver(this,null);
-
- mover = (Transform) getNodeByName("vehicle");
-
- worldPos = mover.translation.getValue();
-
- axisAngle = mover.rotation.getValue();
- q.setAxisAngle(axisAngle);
- q.getEulers(eulers);
-
- }
-
-
-
- protected void finalize() {
-
- removeDeviceObserver(this,"MouseInput");
- getRenderer().removeRenderObserver(this);
- }
-
-
- public boolean onDeviceInput(DeviceInput di, Object userData) {
-
- MouseInput mi = (MouseInput) di;
-
- switch (mi.which){
- case MouseInput.DOWN:
- pixelStartX = mi.x;
- pixelStartY = mi.y;
- return true;
-
-
- case MouseInput.DRAG:
-
- //PIXEL OPERATIONS
- pixelEndX = mi.x;
- pixelEndY = mi.y;
-
- int dragDistanceX = pixelEndX - pixelStartX;
- int dragDistanceY = pixelEndY - pixelStartY;
-
- pixelStartX = pixelEndX;
- pixelStartY = pixelEndY;
-
-
- //ROTATING THE OBJECT
-
- //convert x drag to rotation
- // at 30 pixels/radian
- float rotationDelta = -(dragDistanceX/30f);
-
- //compute new heading
- eulers[0] = eulers[0] + rotationDelta;
-
- //Convert from Eulers to AxisAngle
- // using the Quaternion
- q.setEulers(eulers);
- q.getAxisAngle(axisAngle);
-
-
- //TRANSLATING THE OBJECT
-
- //covert y drag to distance
- //at 2 meters per pixel
- float translationDelta = dragDistanceY * 2.0f;
-
- //make a vector pointing
- //in z direction
- float[] vector = {0,0, translationDelta};
-
- //rotate the vector using
- //value in quaternion
- q.xform(vector);
-
- //add rotated vector
- //to current position
- worldPos[0] = worldPos[0] + vector[0];
- worldPos[2] = worldPos[2] + vector[2];
-
-
- return true;
-
- }//end of switch
-
- return false;
- }
-
- public void onPreRender(Renderer r, Object data){
- //set the Transform to
- //updated axis angle values
- mover.rotation.setValue(axisAngle);
-
- //set Transform to new position
- mover.translation.setValue(worldPos);
- }
- public void onPostRender(Renderer r, Object data){
- }
-
- } //end of class